/**
 * Word文档导入工具
 * 使用mammoth库将Word文档转换为HTML，并处理转换后的内容
 */

import * as mammoth from 'mammoth/mammoth.browser'
import type { WordStyleMapConfig } from './wordStyleMap'
import { getDefaultWordStyleMap } from './wordStyleMap'
import { processWordHtml } from './htmlProcessor'

export interface WordImportOptions {
  /** 自定义样式映射配置 */
  styleMapConfig?: WordStyleMapConfig
  /** 是否包含嵌入式样式映射 */
  includeEmbeddedStyleMap?: boolean
  /** 图片转换函数 */
  convertImage?: (image: any) => Promise<{ src: string } | null>
  /** 是否处理HTML内容 */
  processHtml?: boolean
}

export interface WordImportResult {
  /** 转换后的HTML内容 */
  html: string
  /** 转换过程中的消息 */
  messages: Array<{ type: string; message: string }>
}

/**
 * 默认图片转换函数
 * 将Word中的图片转换为base64 data URL
 */
async function defaultConvertImage(image: any): Promise<{ src: string } | null> {
  try {
    // 检查image对象是否有效
    if (!image || typeof image.read !== 'function') {
      console.warn('图片对象无效，跳过转换')
      return null
    }
    
    const buffer = await image.read('base64')
    if (!buffer) {
      console.warn('图片读取失败，返回空缓冲区')
      return null
    }
    
    const contentType = image.contentType || 'image/png'
    return { src: `data:${contentType};base64,${buffer}` }
  } catch (err) {
    console.error('图片转换失败:', err)
    // 返回null而不是抛出错误，避免中断整个转换过程
    return null
  }
}

/**
 * 导入Word文档
 * @param file Word文档文件（.docx格式）
 * @param options 导入选项
 * @returns 导入结果
 */
export async function importWordDocument(
  file: File,
  options: WordImportOptions = {}
): Promise<WordImportResult> {
  // 验证文件类型
  if (!/\.docx$/i.test(file.name)) {
    throw new Error('仅支持 .docx 文件')
  }

  // 读取文件为ArrayBuffer
  const arrayBuffer = await file.arrayBuffer()

  // 获取样式映射配置
  const styleMapConfig = options.styleMapConfig || getDefaultWordStyleMap()

  // 构建mammoth转换选项
  // 注意：如果 includeEmbeddedStyleMap 为 true，可能会与自定义 styleMap 冲突
  // 先尝试使用最保守的配置，避免任何可能导致问题的选项
  const mammothOptions: any = {
    includeEmbeddedStyleMap: false, // 禁用嵌入式样式映射，避免冲突
    styleMap: [], // 先不使用自定义映射，让mammoth使用默认行为
    convertImage: options.convertImage || defaultConvertImage,
  }
  
  // 如果仍然失败，尝试不使用自定义 styleMap
  // 可以先注释掉上面的 styleMap，只使用 mammoth 的默认映射

  // 注意：transformDocument 在 mammoth 中可能会导致问题
  // 我们改用更安全的方式：在 HTML 后处理中应用样式转换
  // 暂时禁用 transformDocument，避免 emptiers[node.type] 错误
  // 如果确实需要运行级别的转换，应该在 HTML 处理阶段进行
  if (false && styleMapConfig.transformConvertRun) {
    // 这个功能暂时禁用，因为会导致 mammoth 内部错误
    // mammothOptions.transformDocument = ...
  }

  console.log('----------------mammothOptions----------------')
  console.log(mammothOptions)
  console.log('----------------mammothOptions----------------')

  // 执行转换
  let value: string
  let messages: Array<{ type: string; message: string }>
  
  try {
    console.log('开始执行 mammoth.convertToHtml（最基础配置）...')
    // 使用最基础的配置，不传递任何可能导致问题的选项
    // 先尝试不传递convertImage，因为图片转换也可能导致问题
    const minimalOptions: any = {}
    
    const result = await mammoth.convertToHtml(
      { arrayBuffer },
      minimalOptions
    )
    value = result.value
    messages = result.messages || []
    console.log('mammoth.convertToHtml 执行成功（最基础配置）')
    console.log('----------------value----------------')
    console.log(value)
    console.log('----------------value----------------')
    console.log('----------------messages----------------')
    console.log(messages)
    console.log('----------------messages----------------')
    
    // 如果基本转换成功，尝试应用自定义映射（可选）
    // 但这次我们不在mammoth中应用，而是在HTML后处理中应用样式
    // 因为mammoth的styleMap可能会导致问题，我们通过HTML后处理来应用样式映射
  } catch (error) {
    console.error('mammoth.convertToHtml 执行失败（最基础配置）:', error)
    
    // 如果最基础配置也失败，说明文档可能包含不支持的内容
    // 尝试完全不传递任何选项（包括convertImage）
    console.log('尝试使用完全默认配置（无任何选项）...')
    try {
      const result = await mammoth.convertToHtml(
        { arrayBuffer },
        {} // 完全不传递任何选项
      )
      value = result.value
      messages = result.messages || []
      console.log('使用完全默认配置转换成功')
    } catch (finalError) {
      console.error('所有尝试都失败:', finalError)
      throw new Error(
        `Word文档转换失败。文档可能包含不支持的内容（如复杂的表格结构、嵌入对象、OLE对象等）。` +
        `\n请尝试：` +
        `\n1. 在Word中另存为新文档` +
        `\n2. 移除复杂的表格、嵌入对象等` +
        `\n3. 简化文档格式后再导入` +
        `\n\n原始错误: ${error instanceof Error ? error.message : String(error)}`
      )
    }
  }

  // 处理HTML内容
  let processedHtml = value
  if (options.processHtml !== false) {
    processedHtml = processWordHtml(value)
  }

  return {
    html: processedHtml,
    messages: messages || [],
  }
}

/**
 * 过滤和处理导入消息
 * 过滤掉不必要的警告信息，只保留重要的错误和提示
 * @param messages 原始消息数组
 * @returns 过滤后的消息数组
 */
export function filterImportMessages(
  messages: Array<{ type: string; message: string }>
): Array<{ type: string; message: string }> {
  if (!Array.isArray(messages)) {
    return []
  }

  // 首先过滤出错误消息
  const fatal = messages.filter((m: any) => m?.type === 'error')
  if (fatal.length > 0) {
    return fatal
  }

  // 过滤警告消息，忽略一些常见的、不影响功能的警告
  const displayable = messages.filter((m: any) => {
    const msg = (m?.message || '') as string
    if (m?.type !== 'warning') return true
    
    // 忽略未识别的段落样式警告
    if (/Unrecognised paragraph style/i.test(msg)) return false
    // 忽略样式映射解析警告
    if (/Did not understand this style mapping/i.test(msg)) return false
    // 忽略其他常见的样式相关警告
    if (/Unrecognised character style/i.test(msg)) return false
    
    return true
  })

  return displayable
}

